#ifndef __VIDEOMANAGER__
#define __VIDEOMANAGER__

#include <memory>
#include <string>
#include <vector>
#include <SDL/SDL.h>
#include "CObject.h"
#include "CFrame.h"
#include "CVector.h"
#include "CImage.h"

#define _FLAGS  SDL_HWSURFACE | SDL_DOUBLEBUF
#define _HARD

class CCore;

/*!
	Gerencia os recursos de vídeo SDL
*/
class CVideoManager : public CObject
{
public:
    static CVideoManager* getInstance()
    {
        if(!m_instance.get())
            m_instance = std::auto_ptr<CVideoManager>(new CVideoManager());
        return m_instance.get();
    }
    virtual ~CVideoManager();
    /*!
        Finaliza a classe.
        \return verdadeiro se a operação foi bem sucedida, caso contrário retorna falso.
    */
    bool Release();
    /*!
        Inicializa o vídeo usando o DirectDraw. Cria também o FrontBuffer e BackBuffer.
        \return verdadeiro se a operação foi bem sucedida, caso contrário retorna falso.
    */
    bool Initialize();
    /*!
        Carrega uma imagem.
        \param cp_chFileName: arquivo do bitmap da imagem a ser criada.
        \return Ponteiro para a imagem criada.
    */
    CImage * LoadImage(const std::string&  cp_chFileName);
    /*!
        Deleta uma imagem.
        \param p_Image: Endereço do ponteiro da imagem a ser deletada.
        \return verdadeiro se a operação foi bem sucedida, caso contrário retorna falso.
    */
    bool DeleteImage(CImage ** p_Image);
    /*!
        Faz a troca do BackBuffer para o FrontBuffer, mostrando na tela.
    */
    void Blit();
    /*!
        Muda o modo de video por meio da lib SDL
        \param bFullscreenPam: verdadeiro para Tela Cheia e falso para Janela.
        \param NewSize: Dimensões do jogo.
    */
    void SetVideoMode(bool bFullscreenPam, const CVector& NewSize);
    void SetVideoMode(bool bFullscreenPam, int h,int w);
    /*!
        Configura titulo da janela e icone de exibição
    */
    void SetAppName(const std::string&  namePam, const std::string&  iconFilePam);
    void ClearScreen();

    CVector WindowSize;
    bool bFullScreen;
    std::vector<CImage*> Images;
    CImage Screen;
private:
    static std::auto_ptr<CVideoManager> m_instance;
    CVideoManager();
};

#endif
